From 8ff08e7c5e7da785a37c56018b1ae4b57cb77e64 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Fri, 24 Aug 2012 18:17:52 +0200 Subject: [PATCH] stylecontext: Update computed values when dependencies change This fixes the longstanding bug where GTK would not update styles when parent styles would change. https://bugzilla.gnome.org/show_bug.cgi?id=672046 --- gtk/gtkstylecontext.c | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index e37edd5511..7163b81d8f 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -2924,6 +2924,36 @@ gtk_style_context_clear_cache (GtkStyleContext *context) g_hash_table_remove_all (priv->style_data); } +static void +gtk_style_context_update_cache (GtkStyleContext *context, + const GtkBitmask *parent_changes) +{ + GtkStyleContextPrivate *priv; + GHashTableIter iter; + gpointer key, value; + + priv = context->priv; + + g_hash_table_remove_all (priv->style_data); + + g_hash_table_iter_init (&iter, priv->style_data); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + GtkStyleInfo *info = key; + StyleData *data = value; + GtkBitmask *changes; + + changes = _gtk_bitmask_copy (parent_changes); + changes = _gtk_bitmask_intersect (changes, data->store->depends_on_parent); + if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_COLOR)) + changes = _gtk_bitmask_union (changes, data->store->depends_on_color); + if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_FONT_SIZE)) + changes = _gtk_bitmask_union (changes, data->store->depends_on_font_size); + + build_properties (context, data->store, info->state_flags, changes); + } +} + static void gtk_style_context_do_invalidate (GtkStyleContext *context) { @@ -3113,9 +3143,14 @@ _gtk_style_context_validate (GtkStyleContext *context, gtk_style_context_needs_full_revalidate (context, change)) { if ((priv->relevant_changes & change) & ~GTK_STYLE_CONTEXT_CACHED_CHANGE) - gtk_style_context_clear_cache (context); + { + gtk_style_context_clear_cache (context); + } else - style_info_set_data (info, NULL); + { + gtk_style_context_update_cache (context, parent_changes); + style_info_set_data (info, NULL); + } if (current) { @@ -3144,6 +3179,8 @@ _gtk_style_context_validate (GtkStyleContext *context, changes = _gtk_bitmask_union (changes, current->store->depends_on_color); if (_gtk_bitmask_get (changes, GTK_CSS_PROPERTY_FONT_SIZE)) changes = _gtk_bitmask_union (changes, current->store->depends_on_font_size); + + gtk_style_context_update_cache (context, parent_changes); } if (change & GTK_CSS_CHANGE_ANIMATE && -- 2.30.2